package com.payment.system.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.payment.common.annotation.DataSource;
import com.payment.common.enums.DataSourceType;
import com.payment.system.domain.PaymentOrder;
import com.payment.system.vo.EcharsVo;

/**
 * 交易订单 数据层
 *
 * @author payment
 * @date 2019-02-17
 */
public interface PaymentOrderMapper {
    /**
     * 查询交易订单信息
     *
     * @param id 交易订单ID
     * @return 交易订单信息
     */
    @DataSource(DataSourceType.SLAVE)
    public PaymentOrder selectPaymentOrderById(String id);

    /**
     * 查询交易订单列表
     *
     * @param paymentOrder 交易订单信息
     * @return 交易订单集合
     */
    @DataSource(DataSourceType.SLAVE)
    public List<PaymentOrder> selectPaymentOrderList(PaymentOrder paymentOrder);

    /**
     * 新增交易订单
     *
     * @param paymentOrder 交易订单信息
     * @return 结果
     */
    public int insertPaymentOrder(PaymentOrder paymentOrder);

    /**
     * 修改交易订单
     *
     * @param paymentOrder 交易订单信息
     * @return 结果
     */
    public int updatePaymentOrder(PaymentOrder paymentOrder);

    /**
     * 删除交易订单
     *
     * @param id 交易订单ID
     * @return 结果
     */
    public int deletePaymentOrderById(String id);

    /**
     * 批量删除交易订单
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deletePaymentOrderByIds(String[] ids);

    // 根据上游订单号获取订单
    @DataSource(DataSourceType.SLAVE)
    public PaymentOrder selectPaymentOrderByOrderNo(String orderNo);

    // 后台柱形图 查询一周的交易总额和交易笔数
    @DataSource(DataSourceType.SLAVE)
    EcharsVo selectPaymentOrderByWeek(@Param("agentId") String agentId, @Param("time") String time);

    /**
     * app 端交易明细： 查询当月统计
     *
     * @param merchantId
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    EcharsVo selectMonthRecordByMerchantId(@Param("merchantId") String merchantId);

    /**
     * app 端交易明细：订单类型（0 无卡消费 1养卡消费 2养卡代付3无卡出款5提现 6充值升级）
     *
     * @param merchantId 用户ID
     * @param pageNum    页数
     * @param pageSize   每页条数
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    List<PaymentOrder> selectOrderListByApp(@Param("merchantId") String merchantId, @Param("num") Integer pageNum,
                                            @Param("size") Integer pageSize);

    // 根据清分状态查询可以清分的订单
    @DataSource(DataSourceType.SLAVE)
    List<PaymentOrder> selectPaymentOrderListByClearingStatus(@Param("clearingStatus") Integer clearingStatus);

    // //根据订单状态和 上游code查询
    @DataSource(DataSourceType.SLAVE)
    List<PaymentOrder> selectPaymentOrderListByStatusAndAcqReturnCode(@Param("status") int status,
                                                                      @Param("msg") String msg, @Param("createTime") String createTime);

    // 根据订单状态，通道返回码和返回信息成功
    @DataSource(DataSourceType.SLAVE)
    List<PaymentOrder> selectPaymentOrderListByStatusAndAcqReturnCodeAndReturnMsg(@Param("status") int status,
                                                                                  @Param("acqCode") String acqCode, @Param("acqMsg") String acqMsg);

    // 查询交易笔数和交易总金额
    @DataSource(DataSourceType.SLAVE)
    Map<String, Object> selectOrderTotalMoney(PaymentOrder paymentOrder);

    // 修改用户订单状态和 清分状态
    public int updateOrderStatusAndClearingStatus(@Param("orderId") String orderId,
                                                  @Param("orderStatus") Integer orderStatus, @Param("clearingStatus") Integer clearingStatus);

    // 用户id 订单类型 查询最新的一条记录
    @DataSource(DataSourceType.SLAVE)
    PaymentOrder getNewestOrderWKByCreditCardIdId(@Param("creditNumber") String creditCardId);

    /**
     * 订单状态 用户id 查询
     *
     * @param merchantId
     * @param status
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    List<PaymentOrder> selectPaymentOrderListByMerchantIdAndStatus(@Param("merchantId") String merchantId,
                                                                   @Param("status") Integer status, @Param("orderType") Integer orderType);

    /**
     * 提现接口用的 查询最近一条提现记录 根据用户ID
     *
     * @param merchantId
     * @return
     */
    PaymentOrder selectPaymentOrderPaymentOut(@Param("merchantId") String merchantId);

    @DataSource(DataSourceType.SLAVE)
    public List<PaymentOrder> selectCardEvaluateHistoryList(@Param("merchantId") String merchantId, @Param("page") Integer page);

    /**
     * 查询成功 升级订单20条
     */
    @DataSource(DataSourceType.SLAVE)
    List<PaymentOrder> selectPaymentOrderListByUpgrade();


    /**
     * 根据订单类型查询成功的订单
     */
    @DataSource(DataSourceType.SLAVE)
    List<PaymentOrder> selectPaymentOrderListByOrderType(@Param("merId")String merId, @Param("orderTypes")Integer[] orderTypes);

    //根据上游订单号获取订单

    public PaymentOrder selectPaymentOrderByAcqOrderNo(@Param("acqOrderNo") String acqOrderNo);
}